package ecommerce.factory.dao.mysql;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

import ecommerce.exception.EcommerceException;
import ecommerce.factory.interfaces.CategoriaDAO;
import ecommerce.to.CategoriaTO;
import ecommerce.util.ConexionBD;
import ecommerce.util.EcommerceLog;

public class MySQLCategoriaDAO implements CategoriaDAO {
    public MySQLCategoriaDAO() {
        
    }

    public void crear(CategoriaTO entidad) throws EcommerceException {
        //JDBC otras alternativas es usar JPA, Spring JDBC,  Hibernate, iBatis
        Connection cn = null;
        PreparedStatement pstm = null;
        String sql;
        try{
            cn = ConexionBD.getInstance().getConexionBD();
            sql = "insert into categoria (cat_nom) values(?)";
            pstm = cn.prepareStatement(sql);            
            pstm.setString(1, entidad.getNombre());
            // 0 no se inserto
            if(pstm.executeUpdate() ==0) {
                throw new EcommerceException("No se pudo insertar");
            }
            
        }catch(EcommerceException e){
            EcommerceLog.error(e);
            throw e;
        }catch(Exception e){
            EcommerceLog.error(e);
            throw new EcommerceException("Error al crear la categoria");
        }finally{
            ConexionBD.getInstance().close(pstm);
            ConexionBD.getInstance().close(cn);
        }
    }

    public void modificar(CategoriaTO entidad) throws EcommerceException {
        //JDBC otras alternativas es usar JPA, Spring JDBC,  Hibernate, iBatis
        Connection cn = null;
        PreparedStatement pstm = null;
        String sql;
        try{
            cn = ConexionBD.getInstance().getConexionBD();
            sql = "update categoria set cat_nom = ? where cat_id = ?";
            pstm = cn.prepareStatement(sql);            
            
            pstm.setString(1, entidad.getNombre());
            pstm.setInt(2, entidad.getId());
            
            // 0 no se inserto
            if(pstm.executeUpdate() ==0) {
                throw new EcommerceException("No se pudo modificar");
            }
            
        }catch(EcommerceException e){
            EcommerceLog.error(e);
            throw e;
        }catch(Exception e){
            EcommerceLog.error(e);
            throw new EcommerceException("Error al modificar la categoria");
        }finally{
            ConexionBD.getInstance().close(pstm);
            ConexionBD.getInstance().close(cn);
        }
    }

    public void eliminar(int id) throws EcommerceException {
        //JDBC otras alternativas es usar JPA, Spring JDBC,  Hibernate, iBatis
        Connection cn = null;
        PreparedStatement pstm = null;
        String sql;
        try{
            cn = ConexionBD.getInstance().getConexionBD();
            sql = "delete from categoria where cat_id = ?";
            pstm = cn.prepareStatement(sql);            
            
            pstm.setInt(1, id);
            
            // 0 no se inserto
            if(pstm.executeUpdate() ==0) {
                throw new EcommerceException("No se pudo eliminar");
            }
            
        }catch(EcommerceException e){
            EcommerceLog.error(e);
            throw e;
        }catch(Exception e){
            EcommerceLog.error(e);
            throw new EcommerceException("Error al eliminar la categoria");
        }finally{
            ConexionBD.getInstance().close(pstm);
            ConexionBD.getInstance().close(cn);
        }        
    }

    public ArrayList<CategoriaTO> traerTodo() throws EcommerceException {
        //JDBC otras alternativas es usar JPA, Spring JDBC,  Hibernate, iBatis
        Connection cn = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        ArrayList<CategoriaTO> arrCateTO = new ArrayList<CategoriaTO>();
        String sql;
        try{
            cn = ConexionBD.getInstance().getConexionBD();
            sql = "select * from categoria";
            pstm = cn.prepareStatement(sql);            
            
            rs = pstm.executeQuery();
            while(rs.next()) {
                CategoriaTO cateTO = new CategoriaTO();
                cateTO.setId(rs.getInt("cat_id"));
                cateTO.setNombre(rs.getString("cat_nom"));
                
                arrCateTO.add(cateTO);
            }
        }catch(EcommerceException e){
            EcommerceLog.error(e);
            throw e;
        }catch(Exception e){
            EcommerceLog.error(e);
            throw new EcommerceException("Error al traer las categorias");
        }finally{
            ConexionBD.getInstance().close(rs);
            ConexionBD.getInstance().close(pstm);
            ConexionBD.getInstance().close(cn);
        }
    
        return arrCateTO;
    }

    public CategoriaTO traerPorId(int id) throws EcommerceException{
        //JDBC otras alternativas es usar JPA, Spring JDBC,  Hibernate, iBatis
        Connection cn = null;
        PreparedStatement pstm = null;
        ResultSet rs = null;
        CategoriaTO cateTO = null;
        String sql;
        try{
            cn = ConexionBD.getInstance().getConexionBD();
            sql = "select * from categoria where cat_id = ?";
            pstm = cn.prepareStatement(sql);            
            pstm.setInt(1, id);
            rs = pstm.executeQuery();
            while(rs.next()) {
                cateTO = new CategoriaTO();
                cateTO.setId(rs.getInt("cat_id"));
                cateTO.setNombre(rs.getString("cat_nom"));                
            }
        }catch(EcommerceException e){
            EcommerceLog.error(e);
            throw e;
        }catch(Exception e){
            EcommerceLog.error(e);
            throw new EcommerceException("Error al traer la categoria");
        }finally{
            ConexionBD.getInstance().close(rs);
            ConexionBD.getInstance().close(pstm);
            ConexionBD.getInstance().close(cn);
        }
        
        return cateTO;
    }
}
